// cypress/e2e/user_password_change.cy.js
describe('用户密码更改功能', () => {
  beforeEach(() => {
    // 忽略应用中的未捕获异常
    cy.on('uncaught:exception', (err, runnable) => {
      return false
    })
    
    // 访问登录页面并登录
    cy.visit('/login')
    cy.wait(2000)
    
    // 拦截登录请求
    cy.intercept('POST', '/api/users/login**', {
      statusCode: 200,
      body: {
        userId: 1,
        account: 'testuser',
        username: 'Test User',
        role: 'Student'
      }
    }).as('login')
    
    // 确保输入框可用
    cy.get('[data-cy=account-input]', { timeout: 10000 })
      .should('be.visible')
      .and('be.enabled')
    
    cy.get('[data-cy=password-input]', { timeout: 10000 })
      .should('be.visible')
      .and('be.enabled')
    
    // 输入凭据并登录
    cy.get('[data-cy=account-input]').type('testuser')
    cy.get('[data-cy=password-input]').type('testpassword')
    cy.get('[data-cy=login-button]').click()
    
    // 等待登录完成
    cy.wait('@login', { timeout: 10000 })
    cy.url({ timeout: 10000 }).should('include', '/mainPage')
    cy.wait(3000)
    
    // 访问用户中心
    cy.visit('/userCenter')
    cy.wait(5000)
  })

  it('用户可以打开账号设置模态框', () => {
    // 使用多种方式尝试找到并点击设置按钮
    cy.contains('账号设置').should('be.visible').click()
      .then(() => {}, (err) => {
        // 备选方案1: 通过类名查找
        cy.get('.settings-btn').should('be.visible').click()
          .then(() => {}, (err) => {
            // 备选方案2: 通过按钮文本查找
            cy.get('button').contains('账号设置').should('be.visible').click()
              .then(() => {}, (err) => {
                // 最后备选方案: 查找所有按钮
                cy.get('button').first().click()
              })
          })
      })
    
    // 验证模态框出现
    cy.get('.modal-window', { timeout: 10000 }).should('be.visible')
    cy.contains('账号设置').should('be.visible')
    cy.contains('请验证身份以修改账号').should('be.visible')
    
    // 验证第一步表单元素存在
    cy.get('#account').should('be.visible')
    cy.get('#current-password').should('be.visible')
    cy.contains('验证').should('be.visible')
  })

  it('用户可以验证身份并更改密码', () => {
    // 点击账号设置按钮（使用多种方式）
    cy.contains('账号设置').should('be.visible').click()
      .then(() => {}, (err) => {
        cy.get('.settings-btn').should('be.visible').click()
          .then(() => {}, (err) => {
            cy.get('button').contains('账号设置').should('be.visible').click()
          })
      })
    
    // 等待模态框出现
    cy.get('.modal-window', { timeout: 10000 }).should('be.visible')
    
    // 拦截密码验证请求
    cy.intercept('GET', '/api/users/checkPassword/user/1**', (req) => {
      const url = new URL(req.url);
      const password = url.searchParams.get('password');
      
      // 检查密码是否正确
      if (password === 'testpassword') {
        req.reply({
          statusCode: 200,
          body: true
        });
      } else {
        req.reply({
          statusCode: 200,
          body: false
        });
      }
    }).as('verifyPassword')
    
    // 拦截用户信息请求
    cy.intercept('GET', '/api/users/1**', {
      statusCode: 200,
      body: {
        userId: 1,
        userAccount: 'testuser',
        userName: 'Test User',
        role: 'Student'
      }
    }).as('getUser')
    
    // 输入当前密码
    cy.get('#current-password', { timeout: 10000 }).should('be.visible').type('testpassword')
    
    // 点击验证按钮
    cy.contains('验证').should('be.visible').click()
    
    // 等待验证完成
    cy.wait('@verifyPassword')
    
    // 验证进入第二步
    cy.contains('修改您的账号信息').should('be.visible')
    
    // 验证第二步表单元素存在
    cy.get('#new-username', { timeout: 10000 }).should('be.visible')
    cy.get('#new-password', { timeout: 10000 }).should('be.visible')
    cy.get('#confirm-password', { timeout: 10000 }).should('be.visible')
    cy.contains('保存更改').should('be.visible')
    
    // 拦截保存设置请求
    cy.intercept('PUT', '/api/users/1**', (req) => {
      const body = req.body;
      // 检查请求体是否包含必要字段
      if (body.currentPassword && body.newPassword && body.newName) {
        req.reply({
          statusCode: 200,
          body: {
            userId: 1,
            userAccount: 'testuser',
            userName: body.newName,
            role: 'Student'
          }
        });
      } else {
        req.reply({
          statusCode: 400,
          body: { message: '参数不完整' }
        });
      }
    }).as('saveSettings')
    
    // 输入新信息
    cy.get('#new-username', { timeout: 10000 }).should('be.visible').clear().type('New Test User')
    cy.get('#new-password', { timeout: 10000 }).should('be.visible').type('newpassword123')
    cy.get('#confirm-password', { timeout: 10000 }).should('be.visible').type('newpassword123')
    
    // 监听alert
    const alertStub = cy.stub();
    cy.on('window:alert', alertStub)
    
    // 点击保存更改
    cy.contains('保存更改').should('be.visible').click()
    
    // 等待保存完成
    cy.wait('@saveSettings').then((interception) => {
      // 验证请求体包含正确的数据
      expect(interception.request.body.currentPassword).to.eq('testpassword')
      expect(interception.request.body.newPassword).to.eq('newpassword123')
      expect(interception.request.body.newName).to.eq('New Test User')
    })
    
    // 验证成功提示
    cy.wrap(alertStub).should('have.been.calledWith', '更新成功！账号信息已更新')
    
    // 验证模态框关闭
    cy.get('.modal-window').should('not.exist')
  })

  it('用户输入错误的当前密码应显示错误信息', () => {
    // 点击账号设置按钮（使用多种方式）
    cy.contains('账号设置').should('be.visible').click()
      .then(() => {}, (err) => {
        cy.get('.settings-btn').should('be.visible').click()
          .then(() => {}, (err) => {
            cy.get('button').contains('账号设置').should('be.visible').click()
          })
      })
    
    // 等待模态框出现
    cy.get('.modal-window', { timeout: 10000 }).should('be.visible')
    
    // 拦截密码验证请求
    cy.intercept('GET', '/api/users/checkPassword/user/1**', {
      statusCode: 200,
      body: false // 返回false表示密码错误
    }).as('verifyPassword')
    
    // 输入错误的当前密码
    cy.get('#current-password', { timeout: 10000 }).should('be.visible').type('wrongpassword')
    
    // 点击验证按钮
    cy.contains('验证').should('be.visible').click()
    
    // 等待验证完成
    cy.wait('@verifyPassword')
    
    // 验证错误消息显示
    cy.get('.error-message').should('be.visible').and('contain.text', '密码错误，请重试')
  })

  it('用户输入空的当前密码应显示错误信息', () => {
    // 点击账号设置按钮（使用多种方式）
    cy.contains('账号设置').should('be.visible').click()
      .then(() => {}, (err) => {
        cy.get('.settings-btn').should('be.visible').click()
          .then(() => {}, (err) => {
            cy.get('button').contains('账号设置').should('be.visible').click()
          })
      })
    
    // 等待模态框出现
    cy.get('.modal-window', { timeout: 10000 }).should('be.visible')
    
    // 不输入密码，直接点击验证按钮
    cy.contains('验证').should('be.visible').click()
    
    // 验证错误消息显示
    cy.get('.error-message').should('be.visible').and('contain.text', '请输入当前密码')
  })

  it('用户输入不匹配的新密码应显示错误信息', () => {
    // 点击账号设置按钮（使用多种方式）
    cy.contains('账号设置').should('be.visible').click()
      .then(() => {}, (err) => {
        cy.get('.settings-btn').should('be.visible').click()
          .then(() => {}, (err) => {
            cy.get('button').contains('账号设置').should('be.visible').click()
          })
      })
    
    // 等待模态框出现
    cy.get('.modal-window', { timeout: 10000 }).should('be.visible')
    
    // 拦截密码验证请求
    cy.intercept('GET', '/api/users/checkPassword/user/1**', {
      statusCode: 200,
      body: true // 密码正确
    }).as('verifyPassword')
    
    // 输入当前密码
    cy.get('#current-password', { timeout: 10000 }).should('be.visible').type('testpassword')
    
    // 点击验证按钮
    cy.contains('验证').should('be.visible').click()
    
    // 等待验证完成
    cy.wait('@verifyPassword')
    
    // 验证进入第二步
    cy.contains('修改您的账号信息').should('be.visible')
    
    // 输入不匹配的新密码
    cy.get('#new-password', { timeout: 10000 }).should('be.visible').type('newpassword123')
    cy.get('#confirm-password', { timeout: 10000 }).should('be.visible').type('differentpassword')
    
    // 验证错误消息显示
    cy.get('.error-message').should('be.visible').and('contain.text', '两次输入的密码不一致')
    
    // 验证保存按钮被禁用
    cy.contains('保存更改').should('be.disabled')
  })

  it('用户可以取消密码修改操作', () => {
    // 点击账号设置按钮（使用多种方式）
    cy.contains('账号设置').should('be.visible').click()
      .then(() => {}, (err) => {
        cy.get('.settings-btn').should('be.visible').click()
          .then(() => {}, (err) => {
            cy.get('button').contains('账号设置').should('be.visible').click()
          })
      })
    
    // 等待模态框出现
    cy.get('.modal-window', { timeout: 10000 }).should('be.visible')
    
    // 点击取消按钮
    cy.contains('取消').should('be.visible').click()
    
    // 验证模态框关闭
    cy.get('.modal-window').should('not.exist')
  })
})